package com.qinyu.treehole.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qinyu.treehole.bo.RegisterUserBo;
import com.qinyu.treehole.bo.UpdateUserBo;
import com.qinyu.treehole.entities.R;
import com.qinyu.treehole.entities.User;
import com.qinyu.treehole.vo.*;

import java.util.List;

public interface UserService extends IService<User> {

    AutoLoginUserVo parseUserToAutoLoginUser(User user);

    User getUserByUserName(String userName);

    /**
     * 匹配用户密码
     * @param psd 用户密码
     * @param md5_psd 数据库中用户密码
     * @return 是否匹配成功
     */
    boolean isPasswordValid(String psd, String md5_psd);

    LoginUserVo parseUserToLoginUserVo(User user, String token);

    /**
     * 为登录用户设置token
     * @param userId
     * @return 返回token
     */
    String setTokenForLoginUser(Integer userId);

    void exitLoginUser(Integer userId);

    User getUserByUserEmail(String email);

    /**
     * 1. 生成不重复激活码
     * 2. 将用户和激活码以map结构存入redis(存活时间5分钟)
     * 3. 为email发送激活码
     * @param registerUserBo
     * @return 激活码
     */
    String getActiveCodeAndSetUser(RegisterUserBo registerUserBo);

    /**
     * 激活用户，返回用户枚举
     * @param code
     * @return
     */
    R activeAndRegisterUser(String code);

    UserSetVo parseUserToUserSetVo(User user);

    boolean updateUserByUpdateUserBo(UpdateUserBo updateUserBo);

    /**
     * 未登录查询
     * @param user
     * @return
     */
    UserIndexVo getUserIndexVoByUser(User user);

    /**
     * 登录查询
     * @param user
     * @param userId 登录用户的id
     * @return
     */
    UserIndexVo getUserIndexVoByUserLogin(User user, Integer userId);

    /**
     * 登录查询自身
     * @param user
     * @return
     */
    UserIndexVo getUserIndexVoBySelfUserLogin(User user);

    List<RelationUserVo> getFansRelationUserVosByUserId(Integer userId);

    List<RelationUserVo> getFollowsRelationUserVosByUserId(Integer userId);

    /**
     * 查询该用户信息，以登录形式
     * @param id 当前用户id
     * @param userId 要查询用户id
     * @return
     */
    List<RelationLoginUserVo> getFansRelationLoginUserVosByUserId(Integer id, Integer userId);

    List<RelationLoginUserVo> getFollowsRelationLoginUserVosByUserId(Integer id, Integer userId);

    /**
     * 根据用户名模糊查询所有用户，按照匹配长度排序
     * @param name 输入’‘时，查询全部用户！
     * @return
     */
    List<RelationUserVo> searchAllUserByName(String name);

    /**
     * 根据用户名模糊查询所有用户，按照匹配长度排序
     * 这里是登录版本的，需要得到userId与这些用户的干系
     * @param name 输入’‘时，查询全部用户！
     * @param userId
     * @return
     */
    List<RelationLoginUserVo> searchAllUserLoginByName(String name, Integer userId);
}
